package de.hdu.tennis.ctrl;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;


import de.hdu.tennis.dao.MitgliedDao;
import de.hdu.tennis.dao.ReservierungDao;
import de.hdu.tennis.dao.TennisplatzDao;
import de.hdu.tennis.model.Reservierung;
/**
 * Reservierungcontroller
 * @author Lilli Kardapolzew, Katharina Weber, Carolina Hirtreiter
 *
 */

@Controller
public class ReservierungController {
	
	private static Logger log = Logger.getLogger(ReservierungController.class);
	private ReservierungDao reservierungDao = null;
	private TennisplatzDao tennisplatzDao = null; 
	private MitgliedDao mitgliedDao = null; 


    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyy");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(
                dateFormat, false));
    }

	/**
     * <p>Edits Reservierung </p>
     * <p>Expected HTTP GET and request '/EditReservierung.hmtl'.<br>
     * Linked Viewname to 'edit-reservierung.jsp'<br>
     * @param id ID of Reservierung - optional, if null then new Reservierung</p>
     * @return ModelAndView edit-reservierung
     */    
@RequestMapping(value="/EditReservierung.html", method=RequestMethod.GET)
public ModelAndView edit(@RequestParam(required=false) Integer id) {
	log.debug("EditReservierung.html");
	ModelAndView mv = new ModelAndView();
	if (id == null) {
		mv.addObject(new ReservierungController());
	} else { 
		mv.addObject(reservierungDao.findById(id));
	}
	mv.addObject("title", "Tennisplatzreservierung");
	mv.addObject("message", "Tragen Sie die Reservierung ein");
	mv.addObject("tennisplaetze", tennisplatzDao.findAll()); 
	mv.setViewName("edit-reservierung");
	return mv;
}


/**
 * <p>Save Reservierung </p>
 * <p>Expected HTTP GET and request '/SaveReservierung.hmtl'.<br>
 * Date problem solved with parseInt using split-method</p>
 * @return redirect AlleReservierung
 */ 
@RequestMapping(value="/SaveReservierung.html", method=RequestMethod.GET)
public String save(HttpServletRequest request, Model model, Reservierung reservierung, Integer t_pk, String timetextend,String timetextstart) {
	int hourEnd =Integer.parseInt(timetextend.split(":")[0]);
	int minEnd = Integer.parseInt(timetextend.split(":")[1]);
	
	int hourStart =Integer.parseInt(timetextstart.split(":")[0]);
	int minStart = Integer.parseInt(timetextstart.split(":")[1]);
	
	reservierung.getEndres().setHours(hourEnd);
	reservierung.getEndres().setMinutes(minEnd);
	
	reservierung.getStartres().setHours(hourStart);
	reservierung.getStartres().setMinutes(minStart);
	if (kannReservieren(reservierung.getStartres(),reservierung.getStartres(),t_pk)) {
		//kann reservieren
		
		HttpSession session = request.getSession();
		int m_pk = Integer.parseInt(session.getAttribute("mId").toString());
		reservierungDao.save(reservierung, t_pk, m_pk);
		model.addAttribute("statusMessageKey", "projekte.form.msg.success");
	    return "redirect:AlleReservierung.html";
	}	
	else
	{
		//kann nicht reservieren
		return "redirect:EditReservierung.html";
		
	}
	
}

/**
 * Method to check if the Tennisplatz is free for Reservierung
 * @param start
 * @param ende
 * @param tennisplatzid
 * @return
 */
private boolean kannReservieren(Date start,Date ende,int tennisplatzid)
{
	List<Reservierung> result = reservierungDao.findAll();
	
	for (Reservierung reservierung : result) {
		
		if (reservierung.getTennisplatz()!=null && reservierung.getTennisplatz().getId() == tennisplatzid) {
			if (start.getTime() < reservierung.getStartres().getTime() && ende.getTime() > reservierung.getEndres().getTime() ) {
				return false;
			}		
			
			if (start.getTime() < reservierung.getEndres().getTime()) {
				return false;
			}
			
			if (ende.getTime() < reservierung.getStartres().getTime()) {
				return false;
			}
		}
	}
	
	return true;
}


/**
 * <p>Delete Reservierung </p>
 * <p>Expected HTTP GET and request '/loescheReservierung.hmtl'.<br>
 * Date problem solved with parseInt using split-method</p>
 * @return redirect AlleReservierung
 */
@RequestMapping(value="/LoescheReservierung.html", method = RequestMethod.GET)
public ModelAndView delete(Reservierung reservierung, Model model) {
log.debug("delete");
    getReservierungDao().delete(reservierung);
    return new ModelAndView("redirect:AlleReservierung.html");   
}


/**
 * <p>Lists Reservierung - for admin all Reservierung - for Mitglied by mitgliedID</p>
 * <p>Expected HTTP GET and request '/AlleReservierung.hmtl'.<br>
 * Date problem solved with parseInt using split-method</p>
 * @return redirect AlleReservierung
 */
@RequestMapping(value="/AlleReservierung.html", method=RequestMethod.GET)
public ModelAndView findAll(HttpServletRequest request) {
	ModelAndView mv = new ModelAndView();
	mv.addObject("title", "Uebersicht aller Reservierungen");
	mv.addObject("message", "Vorhandene Reservierungen");
	
	HttpSession session = request.getSession();
	
	if (session.getAttribute("isAdmin").toString().toLowerCase()=="true") 
	{
		mv.addObject("reservierung", reservierungDao.findAll());
	}
	else
	{
		int mId = Integer.parseInt(session.getAttribute("mId").toString());
		mv.addObject("reservierung", reservierungDao.findAllForMember(mId));
	}
	
	mv.addObject("edit", true);
	mv.setViewName("list-reservierung");
	return mv;
}

Date myStringtoDate(String s) throws ParseException{
	DateFormat df = DateFormat.getInstance();
	SimpleDateFormat sdf = (SimpleDateFormat)df;
	sdf.applyPattern("MM/dd/yyyy HH:mm");
	return df.parse(s);
}




public ReservierungDao getReservierungDao() {
	return reservierungDao;
}

public void setReservierungDao(ReservierungDao reservierungDao) {
	this.reservierungDao = reservierungDao;
}

public TennisplatzDao getTennisplatzDao() {
	return tennisplatzDao;
}

public void setTennisplatzDao(TennisplatzDao tennisplatzDao) {
	this.tennisplatzDao = tennisplatzDao;
}

public MitgliedDao getMitgliedDao() {
	return mitgliedDao;
}

public void setMitgliedDao(MitgliedDao mitgliedDao) {
	this.mitgliedDao = mitgliedDao;
}

}
